﻿using System;
// C#的泛化与C++模板在应用上很相似，但是它们的工作原理却大不相同。两者都产生了生产者和消费者的语义关联，其中生产者的占位符类型由消费者填充。
// 但是C#的泛化中，生产者类（例如开放类型List<T>）可以被编译到程序库中（如mscorlib.dll），因为在生产者和产生关闭类型的消费者间的语义交换直到运行时才实际发生。
// 而C++模板中，这一语义交换是编译时进行的。这表明我们不能在C++中以.dll形式部署模板库，因为生产类仅存在于源代码中。这使得动态语法检查很难实现，更不用说联机创建或参数化类了。
namespace _079_CSharp泛化与C__模板的比较
{
    class Program
    {
        static T Max<T>(T a, T b) where T : IComparable<T>
        {
            return a.CompareTo(b) > 0 ? a : b;
        }
        /* static T Max<T>(T a,T b)
         {
             return a > b ? a : b; // 编译时错误
         }*/
        // 原因是，Max需要编译一次后对所有可能的T值都能工作。上例编译不能通过，因为对于任意类型T，“>”没有统一的含义。实际上并不是所有的类型都支持“>”运算符。
        // 与之对应，下面的代码是用C++模板写的同样Max方法。该代码会为每个T值分别编译，对于特定T呈现“>”不同语义，如果某个T不支持“>”运算符，则编译通不过：
        /*Template <class T> T Max(T a, T b)
         {
             return a > b ? a : b;
         }*/
        static void Main(string[] args)
        {
        }
    }
}